package com.duoec.dw.lineage.service;

import com.duoec.dw.lineage.dto.TableCoordinateDto;
import com.duoec.dw.lineage.dto.TableInfoDto;
import com.duoec.dw.lineage.dto.TableLineageDto;
import com.duoec.dw.lineage.utils.TableLineageConverter;

import java.util.HashMap;
import java.util.Map;

/**
 * @author xuwenzhen
 */
public interface LineageTableService {
    /**
     * 用于存储某个脚本过程创建的临时表
     */
    ThreadLocal<Map<String, TableInfoDto>> RUNTIME_TABLES = new ThreadLocal<>();

    /**
     * 获取表字段信息
     *
     * @param tableCoordinate 数据表
     * @return 字段信息列表
     */
    TableInfoDto getTableDto(TableCoordinateDto tableCoordinate);

    /**
     * 添加一个运行时表 （运行时创建的临时表）
     *
     * @param tableLineage 运行时创建的临时表
     */
    static void addTableDto(TableLineageDto tableLineage) {
        TableInfoDto table = TableLineageConverter.converter(tableLineage);
        addTableDto(table);
    }

    /**
     * 获取表信息
     * @param tableId 表ID：{database}.{table}
     * @return 表信息
     */
    static TableInfoDto getTable(String tableId) {
        Map<String, TableInfoDto> runtimeTables = RUNTIME_TABLES.get();
        if (runtimeTables == null) {
            return null;
        }
        return runtimeTables.get(tableId);
    }

    /**
     * 添加一个运行时表 （运行时创建的临时表）
     *
     * @param table 运行时创建的临时表
     */
    static void addTableDto(TableInfoDto table) {
        Map<String, TableInfoDto> runtimeTables = RUNTIME_TABLES.get();
        if (runtimeTables == null) {
            runtimeTables = new HashMap<>(8);
            RUNTIME_TABLES.set(runtimeTables);
        }
        runtimeTables.put(table.toString(), table);
    }

    /**
     * 如果表被drop掉时，需要从临时表中删除
     *
     * @param tableFullName 表的全名
     */
    static void removeTableDto(String tableFullName) {
        Map<String, TableInfoDto> runtimeTables = RUNTIME_TABLES.get();
        if (runtimeTables == null) {
            return;
        }
        runtimeTables.remove(tableFullName);
    }

    /**
     * 清除运行时临时表
     */
    static void clearTableDto() {
        RUNTIME_TABLES.remove();
    }
}
